Hanoi塔算法思想解释

求汗诺塔N个盘子须几次移动时得到了下面的递推公式:

a[1] = 1;
a[n] = a[n-1] * 2 + 1;

请教通项公式?



a[1] = 1;
a[n] = a[n-1] * 2 + 1;

可得a[i]= 2^i-1;

证明,采用数学归纳法:
1、猜想a[i]= 2^i-1
2、当i=1时,显然成立。
3、假设i=k时成立,即 a[k] = 2^k - 1;则:
由a[n] = a[n-1] * 2 - 1;得
   a[k+1] = a[k] * 2 - 1
          = 2^k * 2 - 1
          = 2^(k-1) - 1
故得证。


同时::
汉诺塔问题(又称河内塔问题)是根据一个传说形成的一个问题: 

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 

1. 每次只能移动一个圆盘; 
2. 大盘不能叠在小盘上面。 

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。 

问:如何移?最少要移动多少次? 
一般取N=64。这样,最少需移动264-1次。即如果一秒钟能移动一块圆盘,仍将需5845.54亿年。目前按照宇宙大爆炸理论的推测,宇宙的年龄仅为137亿年。 

在真实玩具中,一般N=8;这将需移动255次。如果N=10,需移动1023次。如果N=15,需移动32767次;这就是说,如果一个人从3岁到99岁,每天移动一块圆盘,他仅能移动15块。如果N=20,需移动1048575次,即超过了一百万次。 
先看hanoi(1, one, two, three)的情况。这时直接将one柱上的一个盘子搬到three柱上。注意,这里one柱或three柱到底是A、B还是C并不重要,要记住的是函数第二个参数代表的柱上的一个盘被搬到第四个参数代表的柱上。为方便,将这个动作记为: 
one =》three 

再看hanoi(2, one, two, three)的情况。考虑到hanoi(1)的情况已经分析过了,可知这时实际上将产生三个动作,分别是: 
one =》two 
one =》three 
two =》three 
很显然,这实际上相当于将one柱上的两个盘直接搬到three柱上。 

再看hanoi(3, one, two, three)的情况。分析 
hanoi(2, one , three, two) 
one =》three 
hanoi(2, two, one, three) 
即:先将one柱上的两个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的两个盘搬到three柱上。这不就等于将one柱上的三个盘直接搬到three柱上吗? 

运用归纳法可知,对任意n, 
hanoi(n-1, one , three, two) 
one =》three 
hanoi(n-1, two, one, three) 
就是先将one柱上的n-1个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的n-1个盘搬到three柱上。这就是我们所需要的结果! 
双色Hanoi问题是指有两堆不同颜色的盘子,从一侧开始按照规则放置,现在需要将这两堆盘子按照规则全部移到另一侧。这个问题可以使用递归算法来解决。 具体思路如下: 1. 将第一堆盘子的上面 n-1 个盘子移动到第三个柱子上(空柱子); 2. 将第一个柱子上的最后一个盘子移动到第二个柱子上; 3. 将第三个柱子上的 n-1 个盘子移动到第二个柱子上。 其中第一步和第三步可以看作是同一个问题,因此可以使用递归来解决。具体实现时,可以将这个问题看作是将 n 个盘子从第一个柱子移动到第二个柱子,其中第三个柱子作为辅助柱子。因此,递归函数可以定义为: ```python def move(n, source, dest, aux): if n == 1: print("Move disk", n, "from", source, "to", dest) else: move(n-1, source, aux, dest) print("Move disk", n, "from", source, "to", dest) move(n-1, aux, dest, source) ``` 在这个递归函数中,参数 n 表示要移动的盘子数,source、dest、aux 表示三个柱子的编号。当 n=1 时,直接将盘子从 source 移动到 dest 即可,如果 n>1,则需要先将上面的 n-1 个盘子移动到辅助柱子上,再将最后一个盘子从 source 移动到 dest,最后再将辅助柱子上的 n-1 个盘子移动到 dest 上。 使用这个递归函数可以解决双色Hanoi问题。不过需要注意的是,对于双色Hanoi问题,需要将两堆盘子分别看作两个独立的问题来处理。在递归的过程中,需要使用不同的辅助柱子来保证两个问题之间不会相互干扰。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值